package Logica;

import java.security.InvalidKeyException;
import java.util.*;

import javax.swing.ImageIcon;

import Componentes.*;
import Graficos.*;
import Juegos.Posicion;
/**
 * ProyectoX TDP 2011
 * @author  Ma Gimena Ramos- LU:82716
 * @autor Brenda Dilschneider- LU: 92774
 *
 */

public class ManejoLogico {
	private Hashtable<Character,Componente> mapeoComponente;
	private Map<Posicion,Componente> diccionarioComponentes;
	
	
	/**
	 * constructor
	 * @param nivel nivel a cargar
	 */
	public ManejoLogico( int nivel){
	mapeoComponente= new  Hashtable<Character,Componente>(10);
	
			try {
				cargarMapeo();
			} catch (InvalidKeyException e) {
				
				e.printStackTrace();
			}
			diccionarioComponentes=new HashMap<Posicion,Componente>(20);
	if (nivel==0)
		new CreatorByFile("/Niveles/nivel.txt",this);
	else
		if (nivel==1)
			new CreatorByFile("/Niveles/nivel1.txt",this);
		else
			new CreatorByFile("/Niveles/nivel2.txt",this);
	
}

	

		
		         
 /**codificacion del mapeo:
 * b=bloque sorpresa.
 * x=bloque escalonado.
 * c=pared.
 * m=moneda.
 * g=goomba.
 * q=tortuga.
 * e=estrella.
 * f=fin.
 * @throws InvalidKeyException 
 * 
 */
public void cargarMapeo() throws InvalidKeyException{
		Componente c=null;
		Power_Up p = null;
		Enemigo m = null;
		ComponenteGrafico g;
		
	//bloque Sorpresa=B
		Character B = new Character('B');
		c = new Caja();
		g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/BloqueS.gif")));
		c.setGrafico(g);
		
		mapeoComponente.put(B, c);
	
		//bloque escalonado=X
				Character X = new Character('X');
				c = new Bloque_Escalonado();
				g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/Base1.png")));
				
				c.setGrafico(g);
			
				mapeoComponente.put(X, c);
				
				//pared=C
				Character C = new Character('C');
				c = new Pared();
				g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/BloqueR1.png")));
				c.setGrafico(g);
				mapeoComponente.put(C, c);
	
				//vida=U
				Character U = new Character('U');
				p = new HongoVerde();
				g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/1up.gif")));
				p.setGrafico(g);
				mapeoComponente.put(U, p);
							
	//moneda=M
	Character M = new Character('M');
	p = new Moneda();
	g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/moneda.gif")));
	p.setGrafico(g);
		mapeoComponente.put(M, p);
	

	//goomba=G 
	Character G = new Character('G');
	m = new Goomba();
	g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/goomba.gif")));
	m.setGrafico(g);
	
		mapeoComponente.put(G, m);
	
	
	//Koompa Troopa=Q
	Character Q = new Character('Q');
	m = new KoombaTroopa();
	g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/greenparatroopa2.gif")));
	c.setGrafico(g);
	mapeoComponente.put(Q, m);
	
	
	//estrella=E
	Character E = new Character('E');
	p = new Estrella();
	g = new ComponenteGrafico(null);
	p.setGrafico(g);
	
	mapeoComponente.put(E, p);

	
	//S= flor de fuego
	Character S = new Character('S');
	p = new FlorDeFuego();
	g = new ComponenteGrafico(null);
	p.setGrafico(g);
	mapeoComponente.put(S, p);
	
	Character H = new Character('H');
	c = new SuperHongo();
	g = new ComponenteGrafico(null);
	c.setGrafico(g);
	mapeoComponente.put(H, c);
	
	//hongo verde=N
		Character N = new Character('N');
		p = new HongoVerde();
		g = new ComponenteGrafico(null);
		p.setGrafico(g);
		mapeoComponente.put(N, p);
		//bloq oculto= O
		Character O = new Character('O');
		c = new BloqueOculto();
		g = new ComponenteGrafico(null);
		c.setGrafico(g);
		mapeoComponente.put(O, c);
	
	//castillo fin =F
	Character F = new Character('F');
	c = new Castillo();
	g = new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/FinN.png")),95,147);
	
	c.setGrafico(g);
	mapeoComponente.put(F, c);
}
	
/**
 * Carga el diccionario y le asigna la posicion al componente obtenido del mapeo
 * @param x entero del eje x
 * @param y entero del eje y
 * @param c char que codifica al componente en el mapeo
 */
public void CargarNivel(int x,int y, char c){
	
Componente com=obtenerComponente(c);
if (com!=null){
	Componente com1= (Componente) com.clonar();
	com1.setPosicion(x, y);
	
		Posicion p= new Posicion(x,y);
    CargarDiccionario(p,com1);}}
							


/**
 * carga todos los componentes del nivel al diccionario
 * @param x entero del eje x
 * @param c componente a agregar
 */
	public void CargarDiccionario(Posicion p,Componente c){
	
		diccionarioComponentes.put(p, c);
		
	}
	
	/**
	 * obtiene el componente con el char pasado por parametro
	 * @param c char
	 * @return componente
	 */
	public Componente obtenerComponente(char c){
		
		return mapeoComponente.get(c);
	}
	
	/**
	 * dada una posiccion busca el componente que se encuentra en esa posicion
	 * @param i valor de x en la posicion
	 * @param j valor de y en la posicion
	 * @return componente de esa posicion
	 */
	public Componente BuscarDiccionario(int i,int j){
		for (Componente e:diccionarioComponentes.values())
	{if (e.obtenerPosicion().getX()==i && e.obtenerPosicion().getY()==j  )
			return e;
	}
		return null;
		
	}
 	
	/**
	 * retorna una coleccion de componente
	 * @return coleccion de componentes
	 */
	public Iterable<Componente> obtenerComponentes(){
		List<Componente> lista= new ArrayList<Componente>();
		for(Componente e: diccionarioComponentes.values()){
					lista.add(e);
		}
		return lista;
	}
	}
